from array import array

import numpy as np
from numpy.testing.utils import print_assert_equal

np.random.seed(0)
x1 = np.random.randint(10,size=6)
x2 = np.random.randint(10, size=(3,4))
x3 = np.random.randint(10,size=(3,4,5))

# 个数组有 nidm（数组的维度）、shape（数组每个维度的大小）和size（数组的总大小）属性：
print("x3 ndim: ", x3.ndim)
print("x3 shape: ", x3.shape)
print("x3 size: ",x3.size)

#其他的属性包括表示每个数组元素字节大小的 itemsize，以及表示数组总字节大小的属性
print("dtype: ", x3.dtype)
print("itemsize: ", x3.itemsize, "bytes")
print("nbytes: ", x3.nbytes, "bytes")

#在多维数组中，可以用逗号分隔的索引元组获取元素：
print(x2)
print(x2[0, 0])
#请注意，和 Python 列表不同，NumPy 数组是固定类型的。这意味着当你试图将一个浮点
# 值插入一个整型数组时，浮点值会被截短成整型。并且这种截短是自动完成的，不会给你
# 提示或警告，所以需要特别注意这一点

#切片  x[start:stop:step]
x = np.arange(10)
print(x[:5])
print(x[::2])
print(x[1::2])
#你可能会在步长值为负时感到困惑。在这个例子中，start 参数和 stop 参数默认是被交换的。
print(x[::-1])
print(x[5::-2])

print(x2)
print(x2[:2, :3])
print(x2[:3, ::2])
print(x2[::-1,::-1])

print("获取数组的行和列")
print(x2[:,0])   #获取第一列
print(x2[0,:])   #获取第一行
print("在获取行时，出于语法的简介考虑，可以省略空的切片：")
print(x2[0])   #等于x2[0,:]

print("关于数组切片有一点很重要也非常有用，那就是数组切片返回的是数组数据的视图，而\
     不是数值数据的副本。这一点也是 NumPy 数组切片和 Python 列表切片的不同之处：在 \
         Python 列表中，切片是值的副本。")
print(x2)
x2_sub = x2[:2,:2]
print(x2_sub)
x2_sub[0,0] = 99
print(x2_sub)
print(x2)

print(" 创建数组的副本")
x2_sub_copy = x2[:2,:2].copy()
print(x2_sub_copy)
x2_sub_copy[0,0]=42
print(x2_sub_copy)
print(x2)

print("数据的变形")
grid = np.arange(1,10).reshape((3,3))
print(grid)
print("将一个一维数组转变为二维的行或列的矩阵")
x = np.array([1,2,3])
print(x.reshape(1,3))
print(x[np.newaxis,:])  #行的位置就是获得新行
print(x.reshape(3,1))
print(x[:,np.newaxis])

print("数组拼接和分裂")
x = np.array([1,2,3])
y = np.array([3,2,1])
print(np.concatenate([x,y]))
z = [99,99,99]
print(np.concatenate([x,y,z]))
grid = np.array([[1,2,3],
                                [4,5,6]])
print(np.concatenate([grid, grid]))
print(np.concatenate([grid, grid], axis = 1))
print("沿着固定维度处理数组时，使用 np.vstack（垂直栈）和 np.hstack（水平栈）函数会")
x = np.array([1,2,3])
grid = np.array([[9,8,7],
                                [6,5,4]])
print(np.vstack([x,grid]))
y = np.array([[99],
                            [99]])
print(np.hstack([grid,y]))
#np.dstack()将沿着第三个维度拼接数组

print("与拼接相反的过程是分裂。分裂可以通过 np.split、np.hsplit 和 np.vsplit 函数来实现。\
    可以向以上函数传递一个索引列表作为参数，索引列表记录的是分裂点位置：")
x = [1,2,3,99,99,3,2,1]
x1, x2, x3 = np.split(x, [3,5])
print(x1,x2,x3)
grid = np.arange(16).reshape((4,4))
print(grid)
upper,lower = np.vsplit(grid, [2])
print(upper)
print(lower)
left, right = np.hsplit(grid, [2])
print(left)
print(right)
#np.dsplit 将数组沿着第三个维度分裂


